const express = require('express')
const router = express.Router()
// 成功 和 失败的 规范化格式
const SuccessModel = require('../module/SuccessModel')
const ErrorModel = require('../module/ErrorModel')
// 整合 multer 中间件
const multer = require('multer')
// 设置文件的上传路径 问 uploads目录
const upload = multer({ dest: 'uploads/' })
// 整合 knex
// 导入模块 并且连接上 本机的数据库
const knex = require('../utils/myKenx')
// 导入 jwt模块
const jwt = require('jsonwebtoken')
// 加密串 弄成变量
const key = 'itheima'

// 注册一个 中间件(回调函数)
router.use((req, res, next) => {
  // console.log('hero的中间件')
  // console.log('req.headers', req.headers)
  // 获取token
  const token = req.headers.authorization
  // 校验token
  jwt.verify(token, key, (err, data) => {
    if (!err) {
      // 不出错 进到这里
      // console.log('data:', data)
      // 执行next
      next()
    } else {
      // 校验出错
      // 失败
      // console.log('err:', err)
      res.send(new ErrorModel({ msg: '请登录', code: 401 }))
    }
  })
})

// 新增英雄接口
router.post('/add', upload.single('icon'), (req, response) => {
  // file 不传文件 是undefined
  // 不提交文本的数据 body 也是对象
  const { file, body } = req
  // 返回结果
  // 接收用户提交的参数
  const { name, title, desc } = body
  if (
    name === undefined ||
    title === undefined ||
    desc === undefined ||
    file === undefined
  ) {
    // 错误
    response.send(new ErrorModel({ msg: '新增失败,请检查' }))
  } else {
    knex('hero')
      .insert({ name, title, desc, icon: file.filename })
      .then(res => {
        // console.log('res:', res)
        response.send(new SuccessModel({ msg: '新增成功' }))
      })
  }
})

// 修改 英雄接口
router.post('/update', upload.single('icon'), (req, response) => {
  // file 不传文件 是undefined
  // 不提交文本的数据 body 也是对象
  const { file, body } = req
  // 接收传递的参数 req.body
  const { id, name, title, desc } = body
  // 没有传递参数
  if (
    id === undefined ||
    name === undefined ||
    title === undefined ||
    desc === undefined ||
    file === undefined
  ) {
    response.send(new ErrorModel({ msg: '修改失败,请检查😭' }))
  } else {
    knex('hero')
      .update({ name, title, desc, icon: file.filename })
      // 限制 已经被软删除的数据 不能再修改
      .where({ id, isdel: 0 })
      .then(res => {
        // console.log('res:', res)
        if (res !== 0) {
          // 成功
          response.send(new SuccessModel({ msg: '修改成功😄' }))
        } else {
          response.send(new ErrorModel({ msg: '修改失败,id有误😭' }))
        }
      })
  }
  // 传递了参数
})

// 软删除 本质是修改
router.post('/delete', (req, response) => {
  // 接收 id
  const { id } = req.body
  // 非空判断
  if (!id) {
    // id为undefined 没有传递
    // 阻断后续代码执行
    response.send(new ErrorModel({ msg: 'id不能为空' }))
    return
  }
  // id有值
  knex('hero')
    .update({ isdel: 1 })
    // 考虑 isdel=0 才可以删除
    .where({ id, isdel: 0 })
    // .where({ id })
    .then(res => {
      // console.log('res:', res)
      if (res === 1) {
        response.send(new SuccessModel({ msg: '删除成功' }))
        return
      }
      // res不为1 删除 失败
      response.send(new ErrorModel({ msg: 'id有误,请检查' }))
    })
})

// 详情接口
// (\\d+) 限制id只能是数字
router.get('/:id(\\d+)', (req, response) => {
  // 获取id
  const { id } = req.params
  // console.log('id:', id)
  // response.send('查到了数据,好棒棒哟!')
  knex('hero')
    // 不需要 isdel字段
    .select('id', 'name', 'title', 'icon', 'desc')
    // 查询 需要考虑 isdel的问题
    .where({ id, isdel: 0 })
    .then(res => {
      // console.log('res:', res)
      if (res.length === 0) {
        // id有误
        response.send(new ErrorModel({ msg: 'id有误,请检查' }))
      } else {
        // 返回
        // 详情返回一条数据即可,不用返回数组
        response.send(new SuccessModel({ msg: '查询成功', data: res[0] }))
      }
    })
})

// 查询英雄列表
router.get('/all', (req, response) => {
  // 接收 查询参数
  const { q } = req.query
  if (q === undefined) {
    // 返回所有
    knex('hero')
      .select('id', 'name', 'title', 'icon')
      .where({ isdel: 0 })
      .then(res => {
        response.send(new SuccessModel({ msg: '查询成功', data: res }))
      })
  } else {
    // 查询并返回
    knex('hero')
      .select('id', 'name', 'title', 'icon')
      .where('title', 'like', `%${q}%`)
      .andWhere({ isdel: 0 })
      .then(res => {
        // 没查出来
        if (res.length === 0) {
          response.send(new ErrorModel({ msg: '查询失败,请检查' }))
        } else {
          // 查询出来了
          response.send(new SuccessModel({ msg: '查询成功', data: res }))
        }
      })
  }
})

module.exports = router
